<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>


    <script>

        // 1 改变this指向
        //    1 箭头函数   ->    维持上文的this指向不变
        //    2 call(新的this指向 , arg1 , arg2 , ...)
        //    3 apply(新的this指向 , [arg1 , arg2 , ...])
        //    4 bind   ->参数用法同call  不会调用函数(只改变指向)


        // 2 new作用
        //    创建对象
        //    this -> 对象
        //    返回了这个对象
        //    对象的constructor 指向这个构造函数   ->   正常情况下   对象的constructor都指向object  


        // 3 prototype 原型  每一个函数都有一个属性 prototype    为实例化对象提供公有的属性和方法 
        //     扩展应用    可以通过prototype给js的内置对象添加更多的属性和方法  
        //        Arra.prototype.quChong = function(){}   可以通过这样的方式给数组添加一个方法叫做 quChong   名字无所谓

        // 4 如何自己创建构造函数
        //    把之前写的全局变量  ->  属性
        //    把其他函数 —> 方法   prototype


        // 5 jq  -> 函数库    大大的缩减了DOM操作,链式操作  

        //    链式操作的本质 : 返回同类型的数据




        const a = {} ;
        console.log(a.constructor);    // 

        const  b = [] ;
        console.log(b.constructor);



        // 构造器和实例的关系


        // 类  -> 实例

        // 狗就是一个类   就是构造函数
        // 来福就是一个实例    来福是狗的一个具体的对象


        // 人也是一个类  
        // 张三就是一个实例   张三是一个具体的对象    



        // 男人   ->    类


        // 女人    ->   类

 
        function  Person(){}     //  -> 类   构造函数     -> 用来创建对象(实例)


        const c = new Person()      //  c 就是实例    new的过程就是实例化的过程     c是Person的实例

        // constructor 就是记录这个对象是谁的实例

        console.log(c.constructor);    //  -> Person



        const d = [] ;
        console.log(d.constructor);   // Array

        const e = {} ;
        console.log(e.constructor);   // Object



        // js中的内置构造函数
        //   Number
        //   String
        //   Boolean
       

        //   Array 
        //   Object

        //   Date 

        //   RegExp

        //   HTMLUListElement  像数组  --- 伪数组

        //  

        
        const a1 = 1 ;
        console.log(a1);

        const a2 = new Number(2) ;

        console.log(a1 + a2);

        console.log(a1.constructor);   // Number


        const b1 = 'hi' ;
        const b2 = new String('hi');
        console.log(typeof b1);    // number
        console.log(typeof b2);    // object

        console.log(b1.constructor);   // String


        // null 和 undefined 没有构造器  也无法读取 constructor




        function f() {}

        new f()




        Array.prototype.quChong = function() {
            console.log('noRepeat');
            return this
        }


        const arr = [] ;
        arr.quChong();


        function tj() {}

        tj()

        // arr.tj() ;   // 报错


        console.log(arr);









        // var index = 0 ;
        // // window.index 


        // function Swiper() {
        //     this
        // }

        // Swiper.prototype.autoPlay = function() {

        //     this.index++ ;
        // }


        var arr1 = [1] ;
        var arr2 = [2] ;
        arr1.concat(arr2).slice().quChong().pop()

    </script>
    
</body>
</html>
